#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<string.h>

/*
I write in func1 thread
I write in func2 thread
I write in func1 thread
I write in func2 thread
I write in func1 thread
I write in func2 thread

该程序达到的效果 每个线程都必须把一行输入完后才允许下一个线程工作
如果不加互斥锁的话，则打印效果是这样的

e iIn w friutnce1 i tn hrfuenadc
2 tI hrweraidte
 Iin w fruintec1 i nth freuancd2

 *
 *
 */

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

FILE *fp;

void * func1(void * arg){
	printf("This is func1 thread\n");
	char s[] = "I write in func1 thread\n";
	while(1){
		//pthread_mutex_lock与unlock包裹起来的就是临界区
		pthread_mutex_lock(&mutex);
		int i = 0;
		while(i < strlen(s)){
			fputc(s[i], fp);
			i++;
			usleep(1);
		}
		//若不加这一行，在缓冲区没有写满的情况下，数据不会刷新到文件
		fflush(fp);
		pthread_mutex_unlock(&mutex);
		usleep(1);
	}
}

void * func2(void * arg){	
	printf("This is func2 thread\n");
	char s[] = "I write in func2 thread\n";
	while(1){
		//pthread_mutex_lock与unlock包裹起来的就是临界区
		pthread_mutex_lock(&mutex);
		int i = 0;
		while(i < strlen(s)){
			fputc(s[i], fp);
			i++;
			usleep(1);
		}
		//若不加这一行，在缓冲区没有写满的情况下，数据不会刷新到文件
		fflush(fp);
		pthread_mutex_unlock(&mutex);
		usleep(1);
	}
}

int main(){
	pthread_t tid1, tid2;
	void * ret;

	//定一个临界资源 ：文件
	fp =  fopen("1.txt", "a+");
	if(fp == NULL){
		perror("fopen");
		return 0;
	}

	//线程1：往文件写
	pthread_create(&tid1, NULL, func1, NULL);
	//线程2：往文件写
	pthread_create(&tid2, NULL, func2, NULL);

	//不让进程退出
	while(1){
		sleep(1);
	}
}
